language, grammar (BNF, originally "Backus Normal Form") A
Backus Normal Form was renamed Backus-Naur Form at the
BNF is one of the most commonly used metasyntactic notations
for specifying the
syntax of programming languages, command
sets, and the like. It is widely used for language
descriptions but seldom documented anywhere (how do you
document a
metasyntax?), so that it must usually be learned
Consider this BNF for a US postal address:
postal-address ::= name-part street-address zip-part
personal-part ::= name | initial "."
name-part ::= personal-part last-name [jr-part] EOL
| personal-part name-part
street-address ::= [apt] house-num street-name EOL
zip-part ::= town-name "," state-code ZIP-code EOL
This translates into English as: "A postal-address consists of
a name-part, followed by a street-address part, followed by a
zip-code part. A personal-part consists of either a first
name or an initial followed by a dot. A name-part consists of
either: a personal-part followed by a last name followed by an
optional "jr-part" (Jr., Sr., or dynastic number) and
end-of-line, or a personal part followed by a name part (this
rule illustrates the use of recursion in BNFs, covering the
case of people who use multiple first and middle names and/or
initials). A street address consists of an optional apartment
specifier, followed by a street number, followed by a street
name. A zip-part consists of a town-name, followed by a
comma, followed by a state code, followed by a ZIP-code
followed by an end-of-line."
Note that many things (such as the format of a personal-part,
apartment specifier, or ZIP-code) are left unspecified. These
lexical details are presumed to be obvious from context or
specified somewhere nearby.
There are many variants and extensions of BNF, possibly
"*" or "+".
EBNF is a common one. In fact the example
above isn't the pure form invented for the
ALGOL 60 report.
"[]" was introduced a few years later in
IBM's
PL/Idefinition but is now universally recognised.
ABNF is
another extension.
(1997-11-23)